package com.example.myapplication;

import android.content.Context;
import android.os.SystemClock;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * 设备开关机信息获取服务
 * 不使用数据库，直接使用系统API获取设备电源状态信息
 */
public class DevicePowerInfoService {
    private final Context context;

    public DevicePowerInfoService(Context context) {
        this.context = context;
    }

    /**
     * 获取设备电源信息
     * @return 设备电源信息对象
     */
    public DevicePowerInfo getDevicePowerInfo() {
        DevicePowerInfo info = new DevicePowerInfo();
        
        // 获取系统累计开机时长
        long systemUptime = SystemClock.elapsedRealtime();
        info.systemUptime = systemUptime;
        info.systemUptimeFormatted = formatUptime(systemUptime);
        
        // 计算开机时间
        long bootTime = System.currentTimeMillis() - systemUptime;
        info.bootTime = bootTime;
        info.bootTimeFormatted = formatDateTime(bootTime);
        
        // 获取当前时间
        long currentTime = System.currentTimeMillis();
        info.currentTime = currentTime;
        info.currentTimeFormatted = formatDateTime(currentTime);
        
        // 获取设备信息
        info.deviceModel = android.os.Build.MODEL;
        info.androidVersion = android.os.Build.VERSION.RELEASE;
        info.apiLevel = android.os.Build.VERSION.SDK_INT;
        
        // 获取电池信息（如果可用）
        info.batteryLevel = getBatteryLevel();
        info.isCharging = isDeviceCharging();
        
        // 获取屏幕状态
        info.isScreenOn = isScreenOn();
        
        return info;
    }

    /**
     * 获取电池电量百分比
     * @return 电池电量百分比，如果无法获取则返回-1
     */
    private int getBatteryLevel() {
        try {
            // 这里需要注册BroadcastReceiver来监听电池状态
            // 为了简化，我们返回-1表示无法获取
            return -1;
        } catch (Exception e) {
            return -1;
        }
    }

    /**
     * 检查设备是否正在充电
     * @return true如果正在充电，false如果未充电，null如果无法确定
     */
    private Boolean isDeviceCharging() {
        try {
            // 这里需要注册BroadcastReceiver来监听充电状态
            // 为了简化，我们返回null表示无法确定
            return null;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 检查屏幕是否开启
     * @return true如果屏幕开启，false如果屏幕关闭
     */
    private boolean isScreenOn() {
        try {
            // 使用PowerManager检查屏幕状态
            android.os.PowerManager pm = (android.os.PowerManager) context.getSystemService(Context.POWER_SERVICE);
            return pm != null && pm.isInteractive();
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 格式化开机时长
     * @param milliseconds 毫秒数
     * @return 格式化的时长字符串
     */
    public static String formatUptime(long milliseconds) {
        if (milliseconds < 0) {
            return "未知";
        }

        long seconds = milliseconds / 1000;
        long minutes = seconds / 60;
        long hours = minutes / 60;
        long days = hours / 24;

        if (days > 0) {
            return String.format("%d天%d小时%d分钟%d秒", days, hours % 24, minutes % 60, seconds % 60);
        } else if (hours > 0) {
            return String.format("%d小时%d分钟%d秒", hours, minutes % 60, seconds % 60);
        } else if (minutes > 0) {
            return String.format("%d分钟%d秒", minutes, seconds % 60);
        } else {
            return String.format("%d秒", seconds);
        }
    }

    /**
     * 格式化日期时间
     * @param timestamp 时间戳
     * @return 格式化的日期时间字符串
     */
    public static String formatDateTime(long timestamp) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        return sdf.format(new Date(timestamp));
    }

    /**
     * 设备电源信息数据类
     */
    public static class DevicePowerInfo {
        // 系统开机时长
        public long systemUptime;
        public String systemUptimeFormatted;
        
        // 开机时间
        public long bootTime;
        public String bootTimeFormatted;
        
        // 当前时间
        public long currentTime;
        public String currentTimeFormatted;
        
        // 设备信息
        public String deviceModel;
        public String androidVersion;
        public int apiLevel;
        
        // 电池信息
        public int batteryLevel; // -1表示无法获取
        public Boolean isCharging; // null表示无法确定
        
        // 屏幕状态
        public boolean isScreenOn;
        
        @Override
        public String toString() {
            return "DevicePowerInfo{" +
                    "systemUptime=" + systemUptimeFormatted +
                    ", bootTime=" + bootTimeFormatted +
                    ", currentTime=" + currentTimeFormatted +
                    ", deviceModel='" + deviceModel + '\'' +
                    ", androidVersion='" + androidVersion + '\'' +
                    ", apiLevel=" + apiLevel +
                    ", batteryLevel=" + batteryLevel +
                    ", isCharging=" + isCharging +
                    ", isScreenOn=" + isScreenOn +
                    '}';
        }
    }
}
